# [钛妹]:听说Python生成器能省内存？但为啥要用yield不用return呢？咱们今天用三个场景彻底搞懂它！

def 水果生成器():
    yield "苹果"
    yield "香蕉"
    yield "西瓜"

# [钛哥]:看这个生成器函数！普通函数用return直接返回，生成器用yield暂停执行
购物车 = 水果生成器()
print(next(购物车))  # 第一次唤醒生成器
print(next(购物车))  # 从上次暂停处继续执行
print(next(购物车))  # 取出最后一个值

# [钛妹]:原来yield像书签一样记住位置！那取完了会怎样？
try:
    print(next(购物车))  # 尝试获取第四个元素
except StopIteration:
    print("库存告急！水果卖光啦～")

# [钛哥]:生成器的必杀技是处理海量数据！比如这个无限素数生成器
def 素数生成器():
    num = 2
    while True:
        if all(num%i !=0 for i in range(2,int(num**0.5)+1)):
            yield num
        num +=1

# [钛妹]:快给我前5个素数！注意别让电脑卡死哦～
素数 = 素数生成器()
print("\n前5个素数:")
for _ in range(5):
    print(next(素数))

# [钛哥]:对比普通函数生成100万素数，内存直接爆炸！
def 普通素数列表(n):
    result = []
    num = 2
    while len(result) < n:
        if all(num%i !=0 for i in range(2,int(num**0.5)+1)):
            result.append(num)
        num +=1
    return result

# [钛妹]:真的耶！生成器用多少算多少，这才是流式处理精髓～
print("\n前3个素数:", 普通素数列表(3))

# [钛哥]:生成器表达式也很实用，括号换成圆括号就行
平方生成器 = (x**2 for x in range(1,6))
print("\n平方数生成器:")
print(next(平方生成器))
print(next(平方生成器))

# [钛妹]:那实际开发中怎么用呢？举个真实案例吧！
def 日志监控器(文件路径):
    with open(文件路径) as f:
        while True:
            line = f.readline()
            if not line:
                continue
            if "异常" in line:
                yield line.strip()

# [钛哥]:比如实时监控10GB日志，用生成器发现异常行不卡机！
# 创建演示日志文件
with open("server.log", "w") as f:
    f.write("系统正常\n数据库连接异常\n内存使用正常\n用户登录异常")

print("\n发现异常日志:")
监控器 = 日志监控器("server.log")
print(next(监控器))
print(next(监控器))

# [钛哥]:记住生成器三要素：
# 1. 懒加载省内存 2. 保持执行状态 3. 适合流式处理
# [钛妹]:明白啦！yield就像时光暂停器，让函数变身记忆大师！

print("\n人脑的创造力是机器无法匹敌的！每天进步一点点！点赞关注不迷路！")